package com.chlitina.store.modules.cash.model;

import java.util.ArrayList;
import java.util.List;

import com.chlitina.store.common.utils.StoreProductUtils;
import com.chlitina.store.modules.base.entity.Customer;
import com.chlitina.store.modules.base.entity.StoreCare;
import com.chlitina.store.modules.cash.entity.StoreConsume;
import com.chlitina.store.modules.cash.utils.StoreCashUtils;
import com.chlitina.store.modules.employee.entity.Employee;

/**
 * 
 * @author Songsong.Xu
 * 
 */
public class ShoppingCart {
	private Customer customer;
	private String datetime;
	private Employee employeeProduct;
	private List<StoreProductCart> products = new ArrayList<StoreProductCart>();
	private List<StoreCareCart> cares = new ArrayList<StoreCareCart>();

	private List<StoreCareCart> systemCares = new ArrayList<StoreCareCart>();
	private int storeCareCartId = 0;
	private int systemCareCartId = 0;
	private int careId = 0;
	private StoreConsume storeConsume = null;

	public ShoppingCart() {
		storeConsume = StoreCashUtils
				.createStoreConstume(isForMemeber());
	}

	protected boolean isForMemeber() {
		return false;
	}

	public StoreConsume getStoreConsume() {
		return storeConsume;
	}


	public void generateSystemCareCartId(StoreCareCart storeCareCart) {
		if (storeCareCart.getId() == 0) {
			systemCareCartId++;
			storeCareCart.setId(systemCareCartId);
		}
	}

	public void generateCareCartId(StoreCareCart storeCareCart) {
		if (storeCareCart.getId() == 0) {
			careId++;
			storeCareCart.setId(careId);
		}
	}

	public void generateStoreCareCartId(StoreCareCart storeCareCart) {
		if (storeCareCart.getId() == 0) {
			storeCareCartId++;
			storeCareCart.setId(storeCareCartId);
		}
	}

	public void deleteStoreCareCartByCartId(List<StoreCareCart> carts, int id) {
		StoreCareCart toRemove = null;
		for (StoreCareCart storeCareCart : carts) {
			if (storeCareCart.getId() == id) {
				toRemove = storeCareCart;
				break;
			}
		}
		if (toRemove != null) {
			carts.remove(toRemove);
		}
	}

	/**
	 * CACHE DATA
	 */
	private List<StoreCare> systemCareList;
	private List<StoreCare> storeCareList;

	/**
	 * For member consume, store cares is not necessary
	 */
	private List<StoreCareCart> storeCares = new ArrayList<StoreCareCart>();
	private PayElement payElement = new PayElement();

	public Customer getCustomer() {
		return customer;
	}

	public void setCustomer(Customer customer) {
		this.customer = customer;
	}

	public Employee getEmployeeProduct() {
		return employeeProduct;
	}

	public void setEmployeeProduct(Employee employeeProduct) {
		this.employeeProduct = employeeProduct;
	}

	public List<StoreCareCart> getSystemCares() {
		return systemCares;
	}

	public List<StoreCareCart> getStoreCares() {
		return storeCares;
	}

	public List<StoreProductCart> getProducts() {
		return products;
	}

	public List<StoreCareCart> getCares() {
		return cares;
	}

	public void removeCareByCareId(List<StoreCareCart> cares, int id) {
		List<StoreCareCart> remove = new ArrayList<StoreCareCart>();
		for (StoreCareCart care : cares) {
			if (care.getStoreCare().getId() == id) {
				remove.add(care);
			}
		}
		cares.removeAll(remove);
	}

	public void removeCareByCartId(List<StoreCareCart> cares, int id) {
		List<StoreCareCart> remove = new ArrayList<StoreCareCart>();
		for (StoreCareCart care : cares) {
			if (care.getId() == id) {
				remove.add(care);
			}
		}
		cares.removeAll(remove);
	}

	public void removeProduct(List<StoreProductCart> products, int id) {
		List<StoreProductCart> remove = new ArrayList<StoreProductCart>();
		for (StoreProductCart productCart : products) {
			if (productCart.getStoreProduct().getId() == id) {
				remove.add(productCart);
			}
		}
		for (StoreProductCart cart : remove) {
			cart.cancelPayment();
		}
		products.removeAll(remove);
	}

	public void deleteStoreCareByCartId(int id) {
		removeCareByCartId(storeCares, id);

	}

	public void deleteStoreCareByCareId(int id) {
		removeCareByCareId(storeCares, id);

	}

	public void deleteSystemCareByCartId(int id) {
		removeCareByCartId(systemCares, id);

	}

	public void deleteSystemCareByCareId(int id) {
		removeCareByCareId(systemCares, id);

	}

	public void deleteProduct(int id) {
		removeProduct(products, id);
	}

	public PayElement getPayElement() {
		return payElement;
	}

	public void setPayElement(PayElement payElement) {
		this.payElement = payElement;
	}

	/**
	 * update total Prices
	 */
	public void updatePayElement() {
		float totalProductPrice = 0;
		for (StoreProductCart productCart : products) {
			totalProductPrice += productCart.getCount()
					* StoreProductUtils.getRetailPrice(productCart
							.getStoreProduct());
		}
		payElement.setTotalProductPrice(totalProductPrice);

		float totalCarePrice = 0;
		for (StoreCareCart cart : cares) {
			totalCarePrice += cart.getCount() * cart.getSinglePrice();
		}
		payElement.setTotalCarePrice(totalCarePrice);
		payElement.updateTotalPrice();
	}

	public String getDatetime() {
		return datetime;
	}

	public void setDatetime(String datetime) {
		this.datetime = datetime;
	}

	public List<StoreCare> getSystemCareList() {
		return systemCareList;
	}

	public void setSystemCareList(List<StoreCare> systemCareList) {
		this.systemCareList = systemCareList;
	}

	public List<StoreCare> getStoreCareList() {
		return storeCareList;
	}

	public void setStoreCareList(List<StoreCare> storeCareList) {
		this.storeCareList = storeCareList;
	}

	public void addStoreCareCart(StoreCareCart careCart) {
		generateStoreCareCartId(careCart);
		storeCares.add(careCart);
	}

	public void addSystemCareCart(StoreCareCart careCart) {
		generateSystemCareCartId(careCart);
		systemCares.add(careCart);
	}

	public boolean isEmpty() {
		return getCares().isEmpty() && products.isEmpty();
	}
}
